/***************************************************************************

Copyright (c) Microsoft Corporation. All rights reserved.
This code is licensed under the Visual Studio SDK license terms.
THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.

***************************************************************************/

using System;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VsSDK.UnitTestLibrary;

namespace ThreadSafe.JSense.VSIX_UnitTests
{
   static class UIShellServiceMock
   {
      private static GenericMockFactory uiShellFactory;

      #region UiShell Getters
      /// <summary>
      /// Returns an IVsUiShell that does not implement any methods
      /// </summary>
      /// <returns></returns>
      internal static BaseMock GetUiShellInstance()
      {
         if (uiShellFactory == null)
         {
            uiShellFactory = new GenericMockFactory("UiShell", new Type[] { typeof(IVsUIShell), typeof(IVsUIShellOpenDocument) });
         }
         BaseMock uiShell = uiShellFactory.GetInstance();
         return uiShell;
      }

      /// <summary>
      /// Get an IVsUiShell that implements SetWaitCursor, SaveDocDataToFile, ShowMessageBox
      /// </summary>
      /// <returns>uishell mock</returns>
      internal static BaseMock GetUiShellInstance0()
      {
         BaseMock uiShell = GetUiShellInstance();
         string name = string.Format("{0}.{1}", typeof(IVsUIShell).FullName, "SetWaitCursor");
         uiShell.AddMethodCallback(name, new EventHandler<CallbackArgs>(SetWaitCursorCallBack));

         name = string.Format("{0}.{1}", typeof(IVsUIShell).FullName, "SaveDocDataToFile");
         uiShell.AddMethodCallback(name, new EventHandler<CallbackArgs>(SaveDocDataToFileCallBack));

         name = string.Format("{0}.{1}", typeof(IVsUIShell).FullName, "ShowMessageBox");
         uiShell.AddMethodCallback(name, new EventHandler<CallbackArgs>(ShowMessageBoxCallBack));
         return uiShell;
      }
      #endregion

      #region Callbacks
      private static void SetWaitCursorCallBack(object caller, CallbackArgs arguments)
      {
         arguments.ReturnValue = VSConstants.S_OK;
      }

      private static void SaveDocDataToFileCallBack(object caller, CallbackArgs arguments)
      {
         arguments.ReturnValue = VSConstants.S_OK;
      }

      private static void ShowMessageBoxCallBack(object caller, CallbackArgs arguments)
      {
         arguments.ReturnValue = VSConstants.S_OK;
         arguments.SetParameter(10, (int)System.Windows.Forms.DialogResult.Yes);
      }

      #endregion
   }
}